有時安裝組件的時候,必需增加一些程式才能正常的執行,NuGet有提供如同Item Template使用ProjectProperties的功能,撰寫組件所需的程式碼,在安裝Package時將其中的變數,轉換成專案的設定值。
同步發表於:http://www.dotblogs.com.tw/wadehuang36/archive/2011/10/18/nuget-source-code-transformations.aspx
有時安裝組件的時候,必需增加一些程式才能正常的執行,NuGet有提供如同Item Template使用ProjectProperties的功能,撰寫組件所需的程式碼,在安裝Package時將其中的變數,轉換成專案的設定值。
ProjectProperties
ProjectProperties是定義在專案的資訊,C#是.csproj檔,VB是.vbproj檔,以Xml方式定義,例如下列範例。
也可以參考MSDN的ProjectProperties文件,試了一些Property,大部份NuGet都讀不到,只有少數幾個如:
--AssemblyName
--DefaultNamespace
--OutputFileName
--RootNamespace
--等等 少數幾個Property可以用,不過在NuGet最常用的應該只有 RootNamespace吧。
source-code transformations
NuGet的原始碼轉換,檔案名稱後方加上.pp,如產生QueryModel.cs檔案,檔名就必需為QueryModel.cs.pp,有一個地方要注意,原始碼轉換不像設定檔轉換相同名稱檔案會合併,當遇到相同名稱檔案,不會出錯,也沒有訊息警告,就忽略了那個檔案,而在移除時會比對內容,內容不同就不會移除檔案,.pp的內容如同Item Template,使用單個 $ 前後將Property包起來,如 $Property$ ,在安裝Packagea時會換成專案的設定值,如果是不支援的Property,會轉成空白。
範例
這邊以PrecompiledMvcViewEngine的Package為範例。
檔案的配置
.pp不一定要放在根目錄,也可以放在子目錄中。
.pp檔的內容
using System.Web.Mvc;
using System.Web.WebPages;
using PrecompiledMvcViewEngine;
[assembly: WebActivator.PreApplicationStartMethod(typeof($rootnamespace$.App_Start.PrecompiledMvcViewEngineStart), "Start")]
namespace $rootnamespace$.App_Start {
public static class PrecompiledMvcViewEngineStart {
public static void Start() {
var engine = new PrecompiledMvcEngine(typeof(PrecompiledMvcViewEngineStart).Assembly);
ViewEngines.Engines.Insert(0, engine);
// StartPage lookups are done by WebPages.
VirtualPathFactoryManager.RegisterVirtualPathFactory(engine);
}
}
}
範例中使用了 $rootnamespace$ ,在安裝時會換成專案的根命名空間。
目前原始碼轉換只能單純的文字替換,不能有邏輯處理,只能期待未來的版本可以提供T4來轉換原始碼。